package com.tong.hao.batch;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName HaoBatchApp
 * @Author 友野浩二
 * @Date 2019/11/24 21:50
 * @Description 批处理
 * @Version 1.0
 *
 * <pre>
 *     1- Spring Batch(批处理框架)
 *          用来处理大量数据操作的一个框架，主要用来读取大量数据，然后进行一定的处理后输出指定的形式。
 *     2- Spring Batch不是调度框架
 *          Spring Batch本身是批处理逻辑的抽象，是对执行任务的规范化，跟调度框架是两回事。她可以结合调度框架，由调度框架进行
 *     调度Spring Batch作业，完成对批处理的任务。调度框架有相应的开源软件可供选择，如quartz、xxl-job等。
 *     3- Spring Batch框架
 *        主要包含了三个主要高级组件: 应用层(application)、核心层(batch core)和基础架构层(batch infrastructure)。
 *        1).应用层: 包含开发人员使用 spring batch 编写的所有自定义的批处理作业和自定义代码。
 *        2).核心层: 包含启动和控制批处理作业所需的核心运行时类。包括JobLauncher、Job和Step的实现。
 *        3).基础架构曾: 应用层和核心层都建立在通用基础架构上。此基础结构包含通用的读(ItemReader)、写(ItemWriter)和服务处理(如RetryTemplate)。
 *     5- Spring Batch组件
 *        Spring Batch在基础架构层,把任务抽象为Job和Step,一个Job由多个Step来完成,每个Step对应一个ItemReader、ItemProcessor及ItemWriter。
 *     Job是通过JobLauncher来启动,Job及Job的运行结果和状态、Step的运行结果和状态,都会保存在JobRepository中。
 *        1).JobRepository: 作业仓库,保存Job、Step执行过程中的状态及结果,启动Job时需要从JobRepository获取存在的Job Execution
 *        2).JobLauncher: 作业执行器,是执行Job的入口,启动Job的接口
 *        3).Job: 一个批处理任务,由一个或多个Step组成
 *        4).Step: 一个任务具体的执行逻辑单位,每个Step包括 ItemReader -> ItemProcessor -> ItemWriter
 *        5).Item: 一条数据记录
 *        6).ItemReader: 从数据源读数据
 *        7).ItemProcessor: 对数据进行处理,如数据清洗、转换、过滤、校验等
 *        8).ItemWriter: 写入数据到指定目标
 *        9).Chunk: 给定数量的Item集合,如读取到Chunk数量后,才进行写操作
 *        10).Tasklet: Step中具体执行逻辑,可重复执行
 *     6- 数据库
 *        Spring Batch需要用数据库来存储任务的基本信息及运行状态,当然也可以直接使用内存数据库。
 * </pre>
 */
@SpringBootApplication
@RestController
@Slf4j
public class HaoBatchApp {

    public static void main(String[] args) {
        SpringApplication.run(HaoBatchApp.class, args);
        log.info("<<<<======== Tong Batch Started!!! ========>>>>");
    }

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home() {
        return "Tong Batch Started!!!";
    }

}
